In this notebook, we conducted extra analyses (not reported) for Study 4: Confirmatory work with undergraduates.

source("../../scripts_general/dependencies.R")
source("../../scripts_general/custom_funs.R")
source("../../scripts_general/var_recode_contrast.R")
source("../scripts_s4/s4_var_groups.R")
source("../../scripts_general/data_load.R")
Parsed with column specification:
cols(
  .default = col_double(),
  date = col_date(format = ""),
  researcher = col_character(),
  country = col_character(),
  site = col_character(),
  religion = col_character(),
  subject_gender = col_character(),
  subject_job = col_character(),
  subject_schedule = col_character(),
  subject_livedhere = col_character(),
  subject_lang = col_character(),
  subject_marital = col_character(),
  subject_hs = col_character(),
  subject_liveswith = col_character(),
  servicesperweek = col_character(),
  study = col_character()
)
See spec(...) for full column specifications.
Parsed with column specification:
cols(
  .default = col_double(),
  date = col_date(format = ""),
  researcher = col_character(),
  country = col_character(),
  quad = col_character(),
  subject_gender = col_character(),
  subject_job = col_character(),
  subject_schedule = col_character(),
  subject_livedhere = col_character(),
  subject_lang = col_character(),
  subject_marital = col_character(),
  subject_hs = col_character(),
  subject_school = col_character(),
  subject_liveswith = col_character(),
  servicesperweek = col_character(),
  godexpviaawe_freq = col_character(),
  sleephabit = col_character(),
  researcher_date = col_date(format = ""),
  researcher_notes = col_character(),
  site = col_character(),
  religion = col_character()
)
See spec(...) for full column specifications.
Parsed with column specification:
cols(
  .default = col_double(),
  ctry = col_character(),
  wher = col_character(),
  recr = col_character(),
  whoc = col_character()
)
See spec(...) for full column specifications.
Parsed with column specification:
cols(
  .default = col_double(),
  ctry = col_character(),
  wher = col_character(),
  recr = col_character(),
  whoc = col_character(),
  demo_chur = col_character(),
  demo_ethn = col_character(),
  demo_maj = col_character(),
  demo_pocc = col_character(),
  demo_rlgn = col_character(),
  demo_sex = col_character()
)
See spec(...) for full column specifications.
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  .default = col_character(),
  X1 = col_double(),
  epi_subj = col_double(),
  epi_demo_age = col_double(),
  epi_demo_ses_num = col_double(),
  epi_demo_howr_num = col_double(),
  epi_demo_affr_num = col_double(),
  epi_demo_tung_num = col_double(),
  epi_demo_ytng_num = col_double(),
  epi_demo_affr_cat = col_logical(),
  epi_demo_tung_cat = col_logical(),
  epi_demo_ytng_cat = col_logical(),
  epi_version = col_double(),
  epi_charc = col_double()
)
See spec(...) for full column specifications.
2 parsing failures.
 row       col expected  actual                           file
1025 epi_charc a double Unclear '../../study3/data/d_demo.csv'
1027 epi_charc a double Unclear '../../study3/data/d_demo.csv'
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  X1 = col_double(),
  epi_ctry = col_character(),
  epi_subj = col_double(),
  score = col_double()
)
Joining, by = c("epi_ctry", "epi_subj")
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  X1 = col_double(),
  epi_ctry = col_character(),
  epi_subj = col_double(),
  score = col_double()
)
Joining, by = c("epi_ctry", "epi_subj")
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  X1 = col_double(),
  epi_ctry = col_character(),
  epi_subj = col_double(),
  question = col_character(),
  response = col_double(),
  order = col_double(),
  question_text = col_character()
)
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  X1 = col_double(),
  epi_ctry = col_character(),
  epi_subj = col_double(),
  question = col_character(),
  response = col_double(),
  order = col_double(),
  question_text = col_character()
)
Joining, by = c("epi_ctry", "epi_subj", "question", "response", "order", "question_text")
Joining, by = c("epi_ctry", "epi_subj")
Column `epi_ctry` joining character vector and factor, coercing into character vectorJoining, by = "epi_subj"
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  .default = col_double(),
  p7_ctry = col_character(),
  p7_abs_check = col_character(),
  p7_dse_check = col_character(),
  p7_se_check = col_character(),
  p7_unev_check = col_character(),
  p7_exsen_check = col_character(),
  p7_por_check = col_character(),
  p7_mm_check = col_character(),
  p7_dem_sex = col_character(),
  p7_dem_pocc = col_character(),
  p7_dem_major = col_character(),
  p7_dem_ethnicity = col_character(),
  p7_dem_rur.urb = col_character(),
  p7_dem_affrd.basics = col_character(),
  p7_dem_religion = col_character(),
  p7_dem_church = col_character(),
  p7_dem_holy.tung.gif = col_character(),
  p7_abs_child.exp_cat = col_logical(),
  p7_abs_poetic_cat = col_logical(),
  p7_abs_tv.real_cat = col_logical()
  # ... with 162 more columns
)
See spec(...) for full column specifications.
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("study", "p7_ctry", "p7_subj", "abs_score", "cog_score", "ctl_score", "dse_score", "hall_score", "para_score", "por_score", "pv_score", "spev_score")
Joining, by = c("study", "p7_ctry", "p7_subj", "abs_score", "cog_score", "ctl_score", "dse_score", "hall_score", "para_score", "por_score", "pv_score", "spev_score")
object 'd4_study' not found
d4_long <- d4 %>%
  select(p7_ctry, p7_subj, 
         por_score_std, pv_score_std, abs_score_std, dse_score_std, spev_score_std) %>%
  gather(spirit_scale, spirit_score_std, 
         c(dse_score_std, spev_score_std)) %>%
  mutate(spirit_scale = factor(spirit_scale, 
                               levels = c("dse_score_std", "spev_score_std")))

contrasts(d4_long$p7_ctry) <- contrasts_country; contrasts(d4_long$p7_ctry)
         _gh _th _ch _vt
US        -1  -1  -1  -1
Ghana      1   0   0   0
Thailand   0   1   0   0
China      0   0   1   0
Vanuatu    0   0   0   1
contrasts(d4_long$spirit_scale) <- cbind("_spev" = c(-1, 1)); contrasts(d4_long$spirit_scale)
               _spev
dse_score_std     -1
spev_score_std     1

Attempting to fit more complex random effects structures

# more complex random effects structures: NOT REPORTED
# note: never looking for intercepts (random or fixed) by scale, because standardized
r1a <- lmer(spirit_score_std ~ 1 + abs_score_std +
              (1 | p7_ctry/p7_subj) +
              (0 + abs_score_std | p7_ctry) +
              (0 + abs_score_std | spirit_scale),
            data = d4_long) # singular
boundary (singular) fit: see ?isSingular
r1b <- lmer(spirit_score_std ~ 1 + abs_score_std +
              (1 | p7_ctry/p7_subj) +
              (0 + abs_score_std | p7_ctry),
            data = d4_long) # singular
boundary (singular) fit: see ?isSingular
r1c <- lmer(spirit_score_std ~ 1 + abs_score_std +
              (1 | p7_ctry/p7_subj) +
              (0 + abs_score_std | spirit_scale),
            data = d4_long) # failed to converge
Model failed to converge with max|grad| = 0.0024005 (tol = 0.002, component 1)
r1d <- lmer(spirit_score_std ~ abs_score_std + 
              (0 + abs_score_std | p7_ctry) +
              (0 + abs_score_std | spirit_scale),
            data = d4_long) # fine, but doesn't reflect repeated measures design

r1e <- lmer(spirit_score_std ~ 1 + abs_score_std +
              (1 + abs_score_std | p7_ctry), # singular
            # (1 + abs_score_std || p7_ctry), # failed to converge
            data = d4_long) # singular
boundary (singular) fit: see ?isSingular
r1f <- lmer(spirit_score_std ~ 1 + abs_score_std +
              (1 | p7_ctry/p7_subj),
            data = d4_long) # fine, but doesn't account for two scales

r1g <- lmer(spirit_score_std ~ 1 + abs_score_std +
              (0 + abs_score_std | spirit_scale),
            data = d4_long) # overparameterized: only 1 df for testing main effect of abs_score

r1h <- lmer(spirit_score_std ~ 1 + abs_score_std +
              (1 + abs_score_std | p7_ctry) + (1 | p7_subj),
            data = d4_long) # singular
boundary (singular) fit: see ?isSingular
r1i_dse <- lmer(dse_score_std ~ abs_score_std +
                  (1 + abs_score_std | p7_ctry), d4) # singular
boundary (singular) fit: see ?isSingular
r1i_spev <- lmer(spev_score_std ~ abs_score_std +
                   (1 + abs_score_std | p7_ctry), d4) # singular
boundary (singular) fit: see ?isSingular

Primary analysis

Daily Spiritual Experiences

r1_dse <- lmer(dse_score_std ~ abs_score_std + 
                 (1 + abs_score_std || p7_ctry), d4)
boundary (singular) fit: see ?isSingular
summary(r1_dse)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: dse_score_std ~ abs_score_std + (1 + abs_score_std || p7_ctry)
   Data: d4

REML criterion at convergence: 1083.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.6041 -0.6292 -0.0650  0.5742  3.4862 

Random effects:
 Groups    Name          Variance Std.Dev.
 p7_ctry   (Intercept)   0.6440   0.8025  
 p7_ctry.1 abs_score_std 0.0000   0.0000  
 Residual                0.4736   0.6882  
Number of obs: 505, groups:  p7_ctry, 5

Fixed effects:
               Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)     0.01437    0.36018   3.99443    0.04     0.97    
abs_score_std   0.17248    0.03218 499.68843    5.36 1.28e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
abs_scr_std -0.001
convergence code: 0
boundary (singular) fit: see ?isSingular
rsquared(r1_dse)
regtab_fun(r1_dse) %>% regtab_style_fun(row_emph = 2)
Parameter β Std. Err. df t p
Intercept 0.01 0.36 3.99 0.04 0.970
Absorption 0.17 0.03 499.69 5.36 <0.001 ***
# regtab_ran_fun(r1_dse) %>%
#   mutate(Group = case_when(is.na(Group) ~ "Participant, nested within p7_ctry",
#                            TRUE ~ as.character(Group)),
#          Group = factor(Group, levels = c("p7_ctry", 
#                                           "Participant, nested within p7_ctry", 
#                                           "Residual"))) %>%
#   arrange(Group) %>%
#   kable(align = "r") %>%
#   kable_styling(font_size = 16) %>%
#   row_spec(1:nrow(regtab_ran_fun(r1_dse)), color = "black")

Spiritual Events

r1_spev <- lmer(spev_score_std ~ abs_score_std + 
                  (1 + abs_score_std || p7_ctry), d4)
boundary (singular) fit: see ?isSingular
summary(r1_spev)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: spev_score_std ~ abs_score_std + (1 + abs_score_std || p7_ctry)
   Data: d4

REML criterion at convergence: 1220.3

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.7488 -0.6177 -0.1630  0.4747  4.1935 

Random effects:
 Groups    Name          Variance Std.Dev.
 p7_ctry   (Intercept)   0.3702   0.6084  
 p7_ctry.1 abs_score_std 0.0000   0.0000  
 Residual                0.6316   0.7947  
Number of obs: 503, groups:  p7_ctry, 5

Fixed effects:
               Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)     0.01349    0.27440   3.99800   0.049    0.963    
abs_score_std   0.26977    0.03718 498.46528   7.255 1.54e-12 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
abs_scr_std -0.002
convergence code: 0
boundary (singular) fit: see ?isSingular
rsquared(r1_spev)
regtab_fun(r1_spev) %>% regtab_style_fun(row_emph = 2)
Parameter β Std. Err. df t p
Intercept 0.01 0.27 4.00 0.05 0.963
Absorption 0.27 0.04 498.47 7.26 <0.001 ***
# regtab_ran_fun(r1_spev) %>%
#   mutate(Group = case_when(is.na(Group) ~ "Participant, nested within p7_ctry",
#                            TRUE ~ as.character(Group)),
#          Group = factor(Group, levels = c("p7_ctry", 
#                                           "Participant, nested within p7_ctry", 
#                                           "Residual"))) %>%
#   arrange(Group) %>%
#   kable(align = "r") %>%
#   kable_styling(font_size = 16) %>%
#   row_spec(1:nrow(regtab_ran_fun(r1_spev)), color = "black")

p7_ctry as fixed effect

Daily Spiritual Experiences

r2_dse <- lm(dse_score_std ~ abs_score_std * p7_ctry, d4)
summary(r2_dse)

Call:
lm(formula = dse_score_std ~ abs_score_std * p7_ctry, data = d4)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.79477 -0.42791 -0.04314  0.37472  2.40106 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)    
(Intercept)               0.0316884  0.0324797   0.976    0.330    
abs_score_std             0.1728380  0.0336262   5.140 3.96e-07 ***
p7_ctry_gh                0.8272131  0.0624265  13.251  < 2e-16 ***
p7_ctry_th               -0.0455220  0.0672609  -0.677    0.499    
p7_ctry_ch               -1.1316594  0.0661378 -17.111  < 2e-16 ***
p7_ctry_vt                0.7225791  0.0667014  10.833  < 2e-16 ***
abs_score_std:p7_ctry_gh -0.0363167  0.0699995  -0.519    0.604    
abs_score_std:p7_ctry_th  0.1126258  0.0703704   1.600    0.110    
abs_score_std:p7_ctry_ch  0.0003628  0.0739211   0.005    0.996    
abs_score_std:p7_ctry_vt -0.0945542  0.0655455  -1.443    0.150    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.6882 on 495 degrees of freedom
Multiple R-squared:  0.5348,    Adjusted R-squared:  0.5264 
F-statistic: 63.24 on 9 and 495 DF,  p-value: < 2.2e-16
rsquared(r2_dse)
regtab_fun(r2_dse, 
           country_var1 = "p7_ctry_gh", 
           country_var2 = "p7_ctry_th", 
           country_var3 = "p7_ctry_ch", 
           country_var4 = "p7_ctry_vt") %>% 
  regtab_style_fun(row_emph = 2)
Parameter β Std. Err. t p
Intercept 0.03 0.03 0.98 0.330
Absorption 0.17 0.03 5.14 <0.001 ***
Country (Gh.) 0.83 0.06 13.25 <0.001 ***
Country (Th.) -0.05 0.07 -0.68 0.499
Country (Ch.) -1.13 0.07 -17.11 <0.001 ***
Country (Vt.) 0.72 0.07 10.83 <0.001 ***
Absorption × Country (Gh.) -0.04 0.07 -0.52 0.604
Absorption × Country (Th.) 0.11 0.07 1.60 0.110
Absorption × Country (Ch.) 0.00 0.07 0.00 0.996
Absorption × Country (Vt.) -0.09 0.07 -1.44 0.150

Spiritual Events

r2_spev <- lm(spev_score_std ~ abs_score_std * p7_ctry, d4)
summary(r2_spev)

Call:
lm(formula = spev_score_std ~ abs_score_std * p7_ctry, data = d4)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.1858 -0.5031 -0.1084  0.3857  3.3345 

Coefficients:
                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)               0.023818   0.037640   0.633 0.527157    
abs_score_std             0.264300   0.038985   6.780 3.45e-11 ***
p7_ctry_gh                0.808256   0.072548  11.141  < 2e-16 ***
p7_ctry_th               -0.258221   0.077874  -3.316 0.000981 ***
p7_ctry_ch               -0.756335   0.076656  -9.867  < 2e-16 ***
p7_ctry_vt                0.421307   0.077226   5.455 7.74e-08 ***
abs_score_std:p7_ctry_gh -0.017265   0.081107  -0.213 0.831520    
abs_score_std:p7_ctry_th  0.045649   0.081481   0.560 0.575574    
abs_score_std:p7_ctry_ch  0.003628   0.085972   0.042 0.966357    
abs_score_std:p7_ctry_vt -0.079768   0.075899  -1.051 0.293783    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.7966 on 493 degrees of freedom
  (2 observations deleted due to missingness)
Multiple R-squared:  0.3769,    Adjusted R-squared:  0.3655 
F-statistic: 33.13 on 9 and 493 DF,  p-value: < 2.2e-16
rsquared(r2_spev)
regtab_fun(r2_spev,
           country_var1 = "p7_ctry_gh", 
           country_var2 = "p7_ctry_th", 
           country_var3 = "p7_ctry_ch", 
           country_var4 = "p7_ctry_vt") %>%
  regtab_style_fun(row_emph = 2)
Parameter β Std. Err. t p
Intercept 0.02 0.04 0.63 0.527
Absorption 0.26 0.04 6.78 <0.001 ***
Country (Gh.) 0.81 0.07 11.14 <0.001 ***
Country (Th.) -0.26 0.08 -3.32 <0.001 ***
Country (Ch.) -0.76 0.08 -9.87 <0.001 ***
Country (Vt.) 0.42 0.08 5.46 <0.001 ***
Absorption × Country (Gh.) -0.02 0.08 -0.21 0.832
Absorption × Country (Th.) 0.05 0.08 0.56 0.576
Absorption × Country (Ch.) 0.00 0.09 0.04 0.966
Absorption × Country (Vt.) -0.08 0.08 -1.05 0.294

Porosity and absorption differentially predicting individual extraordinary experiences

d4_different <- d4 %>%
  select(p7_ctry, p7_subj, por_score_std, pv_score_std, abs_score_std) %>%
  full_join(d4_byquestion %>% 
              select(-scale) %>%
              # standardize responses by question (collapsing across countries)
              group_by(question) %>%
              mutate(response = scale(response)) %>%
              ungroup() %>%
              spread(question, response) %>%
              select(p7_subj, s4_var_dse, s4_var_spev, s4_var_hall, s4_var_para))
Joining, by = "p7_subj"
d4_different_cor <- d4_different %>%
  select(-p7_ctry, -p7_subj) %>%
  # unite(p7_ctry.p7_subj, p7_ctry, p7_subj, sep = "_") %>%
  # column_to_rownames("p7_ctry.p7_subj") %>%
  cor(use = "pairwise.complete") %>%
  data.frame() %>%
  rownames_to_column("var1") %>%
  gather(var2, cor, -var1)
d4_different_cor2 <- d4_different_cor %>%
  filter(grepl("score", var1),
         !grepl("score", var2)) %>%
  mutate(var1 = factor(
    var1, 
    levels = c("por_score_std", "pv_score_std", "abs_score_std"),
    labels = c("Porosity Scale", "Porosity Vignettes", "Absorption"))) %>%
  left_join(d4_byquestion %>% 
              distinct(scale, question), 
            by = c("var2" = "question")) %>%
  distinct() %>%
  mutate(scale = factor(
    scale,
    levels = c("dse_score", "spev_score", "hall_score", "para_score"),
    labels = c("Daily Spiritual Experiences\n(Underwood & Teresi, 2002)", 
               "Spiritual Events\n(novel measure)",
               "Hallucinations\n(Morrison et al., 2000)", 
               "Paranormal\n(Thalborne & Delin, 1993)")),
    var2_lab = factor(var2,
                      levels = c(s4_var_dse, s4_var_spev, s4_var_hall, s4_var_para),
                      labels = c(paste("Item", 1:length(s4_var_dse)),
                                 paste("Item", 1:length(s4_var_spev)),
                                 paste("Item", 1:length(s4_var_hall)),
                                 paste("Item", 1:length(s4_var_para))))) %>%
  rename(predictor = var1, experience = var2, experience_lab = var2_lab)
d4_different_cor_top4 <- d4_different_cor2 %>%
  group_by(predictor) %>%
  top_n(4, cor) %>%
  arrange(predictor, desc(cor))
d4_different_cor_top4 %>% kable(digits = 2) %>% kable_styling() %>% collapse_rows(1)

predictor experience cor scale experience_lab
Porosity Scale p7_dse_direct.love 0.62 Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 9
p7_dse_guided.daily 0.61 Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 8
p7_dse_lov.thru.othr 0.60 Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 10
p7_dse_spi.strength 0.57 Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 4
Porosity Vignettes p7_se_own.healing 0.51 Spiritual Events (novel measure) Item 22
p7_dse_guided.daily 0.50 Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 8
p7_dse_direct.love 0.49 Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 9
p7_dse_lov.thru.othr 0.48 Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 10
Absorption p7_unev_no.ones.vox 0.36 Hallucinations (Morrison et al., 2000) Item 5
p7_se_spnat.presence 0.33 Spiritual Events (novel measure) Item 12
p7_exsen_dist.msg 0.29 Paranormal (Thalborne & Delin, 1993) Item 6
p7_unev_voice.aloud 0.29 Hallucinations (Morrison et al., 2000) Item 1


d4_different_cor_top4_spev <- d4_different_cor2 %>%
  filter(grepl("Spiritual Events", scale)) %>%
  group_by(predictor) %>%
  top_n(4, cor) %>%
  arrange(predictor, desc(cor))
# d4_different_cor_top4_spev %>% kable(digits = 2) %>% kable_styling() %>% collapse_rows(1)

d4_different_cor_top4_dse <- d4_different_cor2 %>%
  filter(grepl("Daily Spiritual Experiences", scale)) %>%
  group_by(predictor) %>%
  top_n(4, cor) %>%
  arrange(predictor, desc(cor))
# d4_different_cor_top4_dse %>% kable(digits = 2) %>% kable_styling() %>% collapse_rows(1)

d4_different_cor_top4_hall <- d4_different_cor2 %>%
  filter(grepl("Hallucinations", scale)) %>%
  group_by(predictor) %>%
  top_n(4, cor) %>%
  arrange(predictor, desc(cor))
# d4_different_cor_top4_hall %>% kable(digits = 2) %>% kable_styling() %>% collapse_rows(1)

d4_different_cor_top4_para <- d4_different_cor2 %>%
  filter(grepl("Paranormal", scale)) %>%
  group_by(predictor) %>%
  top_n(4, cor) %>%
  arrange(predictor, desc(cor))
# d4_different_cor_top4_para %>% kable(digits = 2) %>% kable_styling() %>% collapse_rows(1)
d4_different_cor2 %>%
  left_join(d4_different_cor_top4 %>% mutate(top4 = "bold")) %>%
  mutate(top4 = case_when(is.na(top4) ~ "plain", TRUE ~ top4)) %>%
  ggplot(aes(x = predictor, y = reorder(experience_lab, desc(experience_lab)), 
             fill = cor, label = format(round(cor, 2), nsmall = 2))) +
  facet_grid(scale ~ ., scales = "free", space = "free") +
  geom_tile(aes(size = top4), 
            color = "black", show.legend = T) +
  geom_text(aes(fontface = top4), 
            size = 3) +
  scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1),
                       guide = guide_colorbar(barwidth = 10, barheight = 0.5)) +
  scale_size_manual(values = c(0.5, 0.05)) +
  theme_minimal() +
  theme(legend.position = "bottom") +
  labs(x = "Predictor", y = "Experience Item", fill = "Pearson's r") +
  guides(size = "none")
Joining, by = c("predictor", "experience", "cor", "scale", "experience_lab")

d4_different_cor2 %>% 
  select(scale, experience_lab, predictor, cor) %>%
  spread(predictor, cor) %>%
  rename(Scale = scale, Item = experience_lab) %>%
  kable(digits = 2) %>%
  kable_styling() # %>%

Scale Item Porosity Scale Porosity Vignettes Absorption
Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 1 0.55 0.44 0.10
Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 2 0.40 0.35 0.18
Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 3 0.52 0.43 0.07
Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 4 0.57 0.43 0.00
Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 5 0.51 0.41 0.00
Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 6 0.36 0.30 0.11
Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 7 0.55 0.42 0.09
Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 8 0.61 0.50 0.17
Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 9 0.62 0.49 0.15
Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 10 0.60 0.48 0.16
Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 11 0.54 0.37 0.21
Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 12 0.45 0.34 0.08
Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 13 0.19 0.17 0.19
Daily Spiritual Experiences (Underwood & Teresi, 2002) Item 14 0.38 0.30 0.14
Spiritual Events (novel measure) Item 1 0.44 0.43 0.20
Spiritual Events (novel measure) Item 2 0.45 0.40 0.18
Spiritual Events (novel measure) Item 3 0.56 0.46 0.22
Spiritual Events (novel measure) Item 4 0.41 0.36 0.14
Spiritual Events (novel measure) Item 5 0.47 0.42 0.25
Spiritual Events (novel measure) Item 6 0.37 0.41 0.18
Spiritual Events (novel measure) Item 7 0.33 0.36 0.09
Spiritual Events (novel measure) Item 8 0.37 0.40 0.10
Spiritual Events (novel measure) Item 9 0.43 0.36 0.16
Spiritual Events (novel measure) Item 10 0.47 0.41 0.21
Spiritual Events (novel measure) Item 11 0.37 0.32 0.27
Spiritual Events (novel measure) Item 12 0.26 0.28 0.33
Spiritual Events (novel measure) Item 13 0.38 0.39 0.18
Spiritual Events (novel measure) Item 14 0.40 0.37 0.13
Spiritual Events (novel measure) Item 15 0.44 0.39 0.16
Spiritual Events (novel measure) Item 16 0.15 0.24 0.18
Spiritual Events (novel measure) Item 17 0.33 0.39 0.16
Spiritual Events (novel measure) Item 18 0.17 0.17 0.23
Spiritual Events (novel measure) Item 19 0.35 0.35 0.13
Spiritual Events (novel measure) Item 20 0.39 0.43 0.13
Spiritual Events (novel measure) Item 21 0.45 0.46 0.20
Spiritual Events (novel measure) Item 22 0.49 0.51 0.23
Hallucinations (Morrison et al., 2000) Item 1 0.15 0.21 0.29
Hallucinations (Morrison et al., 2000) Item 2 0.19 0.24 0.19
Hallucinations (Morrison et al., 2000) Item 3 0.15 0.14 0.24
Hallucinations (Morrison et al., 2000) Item 4 0.10 0.12 0.26
Hallucinations (Morrison et al., 2000) Item 5 0.27 0.26 0.36
Hallucinations (Morrison et al., 2000) Item 6 0.23 0.25 0.21
Paranormal (Thalborne & Delin, 1993) Item 1 0.24 0.16 0.13
Paranormal (Thalborne & Delin, 1993) Item 2 0.19 0.19 0.21
Paranormal (Thalborne & Delin, 1993) Item 3 0.27 0.26 0.16
Paranormal (Thalborne & Delin, 1993) Item 4 0.21 0.18 0.19
Paranormal (Thalborne & Delin, 1993) Item 5 0.29 0.19 0.22
Paranormal (Thalborne & Delin, 1993) Item 6 0.26 0.23 0.29
Paranormal (Thalborne & Delin, 1993) Item 7 0.24 0.20 0.26

  # collapse_rows(1)

By country, version 1 (standardized within country, correlate across)

d4_different_bycountry <- d4 %>%
  select(p7_ctry, p7_subj, por_score_std2, pv_score_std2, abs_score_std2) %>%
  full_join(d4_byquestion %>% 
              select(-scale) %>%
              group_by(p7_ctry, question) %>%
              # standardize responses by country and question
              mutate(response = scale(response)) %>%
              spread(question, response) %>%
              select(p7_subj, s4_var_dse, s4_var_spev, s4_var_hall, s4_var_para))
Adding missing grouping variables: `p7_ctry`
Joining, by = c("p7_ctry", "p7_subj")
d4_different_bycountry_cor <- d4_different_bycountry %>%
  select(-p7_ctry, -p7_subj) %>%
  # unite(p7_ctry.p7_subj, p7_ctry, p7_subj, sep = "_") %>%
  # column_to_rownames("p7_ctry.p7_subj") %>%
  cor(use = "pairwise.complete") %>%
  data.frame() %>%
  rownames_to_column("var1") %>%
  gather(var2, cor, -var1)
d4_different_bycountry_cor2 <- d4_different_bycountry_cor %>%
  filter(grepl("score", var1),
         !grepl("score", var2)) %>%
  mutate(var1 = factor(
    var1, 
    levels = c("por_score_std2", "pv_score_std2", "abs_score_std2"),
    labels = c("Porosity Scale", "Porosity Vignettes", "Absorption"))) %>%
  left_join(d4_byquestion %>% 
              distinct(scale, question), 
            by = c("var2" = "question")) %>%
  distinct() %>%
  mutate(scale = factor(
    scale,
    levels = c("dse_score", "spev_score", "hall_score", "para_score"),
    labels = c("Daily Spiritual Experiences\n(Underwood & Teresi, 2002)", 
               "Spiritual Events\n(novel measure)",
               "Hallucinations\n(Morrison et al., 2000)", 
               "Paranormal\n(Thalborne & Delin, 1993)")),
    var2_lab = factor(var2,
                      levels = c(s4_var_dse, s4_var_spev, s4_var_hall, s4_var_para),
                      labels = c(paste("Item", 1:length(s4_var_dse)),
                                 paste("Item", 1:length(s4_var_spev)),
                                 paste("Item", 1:length(s4_var_hall)),
                                 paste("Item", 1:length(s4_var_para))))) %>%
  rename(predictor = var1, experience = var2, experience_lab = var2_lab)
d4_different_bycountry_cor_top4 <- d4_different_bycountry_cor2 %>%
  group_by(predictor) %>%
  top_n(4, cor) %>%
  arrange(predictor, desc(cor))

d4_different_bycountry_cor_top4_spev <- d4_different_bycountry_cor2 %>%
  filter(grepl("Spiritual Events", scale)) %>%
  group_by(predictor) %>%
  top_n(4, cor) %>%
  arrange(predictor, desc(cor))

d4_different_bycountry_cor_top4_dse <- d4_different_bycountry_cor2 %>%
  filter(grepl("Daily Spiritual Experiences", scale)) %>%
  group_by(predictor) %>%
  top_n(4, cor) %>%
  arrange(predictor, desc(cor))
d4_different_bycountry_cor2 %>%
  left_join(d4_different_bycountry_cor_top4 %>% mutate(top4 = "bold")) %>%
  mutate(top4 = case_when(is.na(top4) ~ "plain", TRUE ~ top4)) %>%
  ggplot(aes(x = predictor, y = reorder(experience_lab, desc(experience_lab)), 
             fill = cor, label = format(round(cor, 2), nsmall = 2))) +
  facet_grid(scale ~ ., scales = "free", space = "free") +
  geom_tile(aes(size = top4), 
            color = "black", show.legend = T) +
  geom_text(aes(fontface = top4), 
            size = 3) +
  scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1),
                       guide = guide_colorbar(barwidth = 10, barheight = 0.5)) +
  scale_size_manual(values = c(0.5, 0.05)) +
  theme_minimal() +
  theme(legend.position = "bottom") +
  labs(x = "Predictor", y = "Experience Item", fill = "Pearson's r") +
  guides(size = "none")
Joining, by = c("predictor", "experience", "cor", "scale", "experience_lab")

By country, version 2 (standardized within country, correlate within)

d4_different_bycountry2 <- d4 %>%
  select(p7_ctry, p7_subj, por_score_std2, pv_score_std2, abs_score_std2) %>%
  full_join(d4_byquestion %>% 
              select(-scale) %>%
              group_by(p7_ctry, question) %>%
              # standardize responses by country and question
              mutate(response = scale(response)) %>%
              ungroup() %>%
              spread(question, response) %>%
              select(p7_subj, s4_var_dse, s4_var_spev, s4_var_hall, s4_var_para))
Joining, by = "p7_subj"
d4_different_bycountry2_cor_us <- d4_different_bycountry2 %>%
  filter(p7_ctry == "US") %>%
  select(-p7_ctry, -p7_subj) %>%
  # unite(p7_ctry.p7_subj, p7_ctry, p7_subj, sep = "_") %>%
  # column_to_rownames("p7_ctry.p7_subj") %>%
  cor(use = "pairwise.complete") %>%
  data.frame() %>%
  rownames_to_column("var1") %>%
  gather(var2, cor, -var1)

d4_different_bycountry2_cor_gh <- d4_different_bycountry2 %>%
  filter(p7_ctry == "Ghana") %>%
  select(-p7_ctry, -p7_subj) %>%
  # unite(p7_ctry.p7_subj, p7_ctry, p7_subj, sep = "_") %>%
  # column_to_rownames("p7_ctry.p7_subj") %>%
  cor(use = "pairwise.complete") %>%
  data.frame() %>%
  rownames_to_column("var1") %>%
  gather(var2, cor, -var1)

d4_different_bycountry2_cor_th <- d4_different_bycountry2 %>%
  filter(p7_ctry == "Thailand") %>%
  select(-p7_ctry, -p7_subj) %>%
  # unite(p7_ctry.p7_subj, p7_ctry, p7_subj, sep = "_") %>%
  # column_to_rownames("p7_ctry.p7_subj") %>%
  cor(use = "pairwise.complete") %>%
  data.frame() %>%
  rownames_to_column("var1") %>%
  gather(var2, cor, -var1)

d4_different_bycountry2_cor_ch <- d4_different_bycountry2 %>%
  filter(p7_ctry == "China") %>%
  select(-p7_ctry, -p7_subj) %>%
  # unite(p7_ctry.p7_subj, p7_ctry, p7_subj, sep = "_") %>%
  # column_to_rownames("p7_ctry.p7_subj") %>%
  cor(use = "pairwise.complete") %>%
  data.frame() %>%
  rownames_to_column("var1") %>%
  gather(var2, cor, -var1)
the standard deviation is zero
d4_different_bycountry2_cor_vt <- d4_different_bycountry2 %>%
  filter(p7_ctry == "Vanuatu") %>%
  select(-p7_ctry, -p7_subj) %>%
  # unite(p7_ctry.p7_subj, p7_ctry, p7_subj, sep = "_") %>%
  # column_to_rownames("p7_ctry.p7_subj") %>%
  cor(use = "pairwise.complete") %>%
  data.frame() %>%
  rownames_to_column("var1") %>%
  gather(var2, cor, -var1)
d4_different_bycountry2_cor <- bind_rows(
  d4_different_bycountry2_cor_us %>% mutate(country = "US"),
  d4_different_bycountry2_cor_gh %>% mutate(country = "Ghana"),
  d4_different_bycountry2_cor_th %>% mutate(country = "Thailand"),
  d4_different_bycountry2_cor_ch %>% mutate(country = "China"),
  d4_different_bycountry2_cor_vt %>% mutate(country = "Vanuatu"))
d4_different_bycountry2_cor2 <- d4_different_bycountry2_cor %>%
  filter(grepl("score", var1),
         !grepl("score", var2)) %>%
  mutate(country = factor(country, levels = levels_country)) %>%
  mutate(var1 = factor(
    var1, 
    levels = c("por_score_std2", "pv_score_std2", "abs_score_std2"),
    labels = c("Porosity Scale", "Porosity Vignettes", "Absorption"))) %>%
  left_join(d4_byquestion %>% 
              distinct(scale, question), 
            by = c("var2" = "question")) %>%
  distinct() %>%
  mutate(scale = factor(
    scale,
    levels = c("dse_score", "spev_score", "hall_score", "para_score"),
    labels = c("Daily Spiritual Experiences\n(Underwood & Teresi, 2002)", 
               "Spiritual Events\n(novel measure)",
               "Hallucinations\n(Morrison et al., 2000)", 
               "Paranormal\n(Thalborne & Delin, 1993)")),
    var2_lab = factor(var2,
                      levels = c(s4_var_dse, s4_var_spev, s4_var_hall, s4_var_para),
                      labels = c(paste("Item", 1:length(s4_var_dse)),
                                 paste("Item", 1:length(s4_var_spev)),
                                 paste("Item", 1:length(s4_var_hall)),
                                 paste("Item", 1:length(s4_var_para))))) %>%
  rename(predictor = var1, experience = var2, experience_lab = var2_lab)
d4_different_bycountry2_cor_top4 <- d4_different_bycountry2_cor2 %>%
  group_by(predictor, country) %>%
  top_n(4, cor) %>%
  arrange(predictor, desc(cor))

d4_different_bycountry2_cor_top4_spev <- d4_different_bycountry2_cor2 %>%
  filter(grepl("Spiritual Events", scale)) %>%
  group_by(predictor, country) %>%
  top_n(4, cor) %>%
  arrange(predictor, desc(cor))

d4_different_bycountry2_cor_top4_dse <- d4_different_bycountry2_cor2 %>%
  filter(grepl("Daily Spiritual Experiences", scale)) %>%
  group_by(predictor, country) %>%
  top_n(4, cor) %>%
  arrange(predictor, desc(cor))
d4_different_bycountry2_cor2 %>%
  left_join(d4_different_bycountry2_cor_top4 %>% mutate(top4 = "bold")) %>%
  mutate(top4 = case_when(is.na(top4) ~ "plain", TRUE ~ top4)) %>%
  ggplot(aes(x = country, y = reorder(experience_lab, desc(experience_lab)), 
             fill = cor, label = format(round(cor, 2), nsmall = 2))) +
  facet_grid(scale ~ predictor, scales = "free", space = "free") +
  geom_tile(aes(size = top4), 
            color = "black", show.legend = T) +
  geom_text(aes(fontface = top4), 
            size = 3) +
  scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1),
                       guide = guide_colorbar(barwidth = 10, barheight = 0.5)) +
  scale_size_manual(values = c(0.5, 0.05)) +
  theme_minimal() +
  theme(legend.position = "bottom",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(x = "Country", y = "Experience Item", fill = "Pearson's r") +
  guides(size = "none")
Joining, by = c("predictor", "experience", "cor", "country", "scale", "experience_lab")

d4 %>%
  select(p7_ctry, p7_subj, ends_with("_std")) %>%
  gather(scale, score, ends_with("std")) %>%
  filter(scale == "dse_score_std") %>%
  ggplot(aes(x = p7_ctry, y = score, color = p7_ctry)) +
  geom_jitter(height = 0, alpha = 0.2) +
  geom_pointrange(data = . %>% 
                    distinct(p7_ctry, p7_subj, score) %>%
                    group_by(p7_ctry) %>% 
                    multi_boot_standard(col = "score", na.rm = T),
                  aes(y = mean, ymin = ci_lower, ymax = ci_lower),
                  color = "black") +
  scale_color_brewer(palette = "Dark2")


d4 %>%
  select(p7_ctry, p7_subj, ends_with("_std")) %>%
  gather(scale, score, ends_with("std")) %>%
  filter(scale == "dse_score_std") %>% 
  distinct(p7_ctry, p7_subj, score) %>% 
  group_by(p7_ctry) %>% 
  multi_boot_standard(col = "score", na.rm = T) %>%
  ungroup() %>%
  ggplot(aes(x = p7_ctry, y = mean, ymin = ci_lower, ymax = ci_upper)) +
  geom_pointrange() +
  ylim(-2, 2)


d4 %>%
  select(p7_ctry, p7_subj, ends_with("_std")) %>%
  gather(scale, score, ends_with("std")) %>%
  filter(scale == "dse_score_std") %>% 
  distinct(p7_ctry, p7_subj, score) %>% 
  group_by(p7_ctry) %>% 
  summarise(mean = mean(score, na.rm = T),
            sd = sd(score, na.rm = T),
            lower = mean - sd,
            upper = mean + sd) %>%
  ggplot(aes(x = p7_ctry, y = mean, ymin = lower, ymax = upper)) +
  geom_pointrange() +
  ylim(-2, 2)

LS0tCnRpdGxlOiAiU3R1ZHkgNDogRXh0cmEgYW5hbHlzZXMgKG5vdCByZXBvcnRlZCkiCnN1YnRpdGxlOiAiTHVocm1hbm4sIFdlaXNtYW4sIGV0IGFsLiIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdGhlbWU6IGZsYXRseQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgpJbiB0aGlzIG5vdGVib29rLCB3ZSBjb25kdWN0ZWQgZXh0cmEgYW5hbHlzZXMgKG5vdCByZXBvcnRlZCkgZm9yIFN0dWR5IDQ6IENvbmZpcm1hdG9yeSB3b3JrIHdpdGggdW5kZXJncmFkdWF0ZXMuCgpgYGB7cn0Kc291cmNlKCIuLi8uLi9zY3JpcHRzX2dlbmVyYWwvZGVwZW5kZW5jaWVzLlIiKQpzb3VyY2UoIi4uLy4uL3NjcmlwdHNfZ2VuZXJhbC9jdXN0b21fZnVucy5SIikKc291cmNlKCIuLi8uLi9zY3JpcHRzX2dlbmVyYWwvdmFyX3JlY29kZV9jb250cmFzdC5SIikKc291cmNlKCIuLi9zY3JpcHRzX3M0L3M0X3Zhcl9ncm91cHMuUiIpCnNvdXJjZSgiLi4vLi4vc2NyaXB0c19nZW5lcmFsL2RhdGFfbG9hZC5SIikKYGBgCgpgYGB7cn0KZDRfbG9uZyA8LSBkNCAlPiUKICBzZWxlY3QocDdfY3RyeSwgcDdfc3ViaiwgCiAgICAgICAgIHBvcl9zY29yZV9zdGQsIHB2X3Njb3JlX3N0ZCwgYWJzX3Njb3JlX3N0ZCwgZHNlX3Njb3JlX3N0ZCwgc3Bldl9zY29yZV9zdGQpICU+JQogIGdhdGhlcihzcGlyaXRfc2NhbGUsIHNwaXJpdF9zY29yZV9zdGQsIAogICAgICAgICBjKGRzZV9zY29yZV9zdGQsIHNwZXZfc2NvcmVfc3RkKSkgJT4lCiAgbXV0YXRlKHNwaXJpdF9zY2FsZSA9IGZhY3RvcihzcGlyaXRfc2NhbGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiZHNlX3Njb3JlX3N0ZCIsICJzcGV2X3Njb3JlX3N0ZCIpKSkKCmNvbnRyYXN0cyhkNF9sb25nJHA3X2N0cnkpIDwtIGNvbnRyYXN0c19jb3VudHJ5OyBjb250cmFzdHMoZDRfbG9uZyRwN19jdHJ5KQpjb250cmFzdHMoZDRfbG9uZyRzcGlyaXRfc2NhbGUpIDwtIGNiaW5kKCJfc3BldiIgPSBjKC0xLCAxKSk7IGNvbnRyYXN0cyhkNF9sb25nJHNwaXJpdF9zY2FsZSkKYGBgCgojIyBBdHRlbXB0aW5nIHRvIGZpdCBtb3JlIGNvbXBsZXggcmFuZG9tIGVmZmVjdHMgc3RydWN0dXJlcwoKYGBge3J9CiMgbW9yZSBjb21wbGV4IHJhbmRvbSBlZmZlY3RzIHN0cnVjdHVyZXM6IE5PVCBSRVBPUlRFRAojIG5vdGU6IG5ldmVyIGxvb2tpbmcgZm9yIGludGVyY2VwdHMgKHJhbmRvbSBvciBmaXhlZCkgYnkgc2NhbGUsIGJlY2F1c2Ugc3RhbmRhcmRpemVkCnIxYSA8LSBsbWVyKHNwaXJpdF9zY29yZV9zdGQgfiAxICsgYWJzX3Njb3JlX3N0ZCArCiAgICAgICAgICAgICAgKDEgfCBwN19jdHJ5L3A3X3N1YmopICsKICAgICAgICAgICAgICAoMCArIGFic19zY29yZV9zdGQgfCBwN19jdHJ5KSArCiAgICAgICAgICAgICAgKDAgKyBhYnNfc2NvcmVfc3RkIHwgc3Bpcml0X3NjYWxlKSwKICAgICAgICAgICAgZGF0YSA9IGQ0X2xvbmcpICMgc2luZ3VsYXIKCnIxYiA8LSBsbWVyKHNwaXJpdF9zY29yZV9zdGQgfiAxICsgYWJzX3Njb3JlX3N0ZCArCiAgICAgICAgICAgICAgKDEgfCBwN19jdHJ5L3A3X3N1YmopICsKICAgICAgICAgICAgICAoMCArIGFic19zY29yZV9zdGQgfCBwN19jdHJ5KSwKICAgICAgICAgICAgZGF0YSA9IGQ0X2xvbmcpICMgc2luZ3VsYXIKCnIxYyA8LSBsbWVyKHNwaXJpdF9zY29yZV9zdGQgfiAxICsgYWJzX3Njb3JlX3N0ZCArCiAgICAgICAgICAgICAgKDEgfCBwN19jdHJ5L3A3X3N1YmopICsKICAgICAgICAgICAgICAoMCArIGFic19zY29yZV9zdGQgfCBzcGlyaXRfc2NhbGUpLAogICAgICAgICAgICBkYXRhID0gZDRfbG9uZykgIyBmYWlsZWQgdG8gY29udmVyZ2UKCnIxZCA8LSBsbWVyKHNwaXJpdF9zY29yZV9zdGQgfiBhYnNfc2NvcmVfc3RkICsgCiAgICAgICAgICAgICAgKDAgKyBhYnNfc2NvcmVfc3RkIHwgcDdfY3RyeSkgKwogICAgICAgICAgICAgICgwICsgYWJzX3Njb3JlX3N0ZCB8IHNwaXJpdF9zY2FsZSksCiAgICAgICAgICAgIGRhdGEgPSBkNF9sb25nKSAjIGZpbmUsIGJ1dCBkb2Vzbid0IHJlZmxlY3QgcmVwZWF0ZWQgbWVhc3VyZXMgZGVzaWduCgpyMWUgPC0gbG1lcihzcGlyaXRfc2NvcmVfc3RkIH4gMSArIGFic19zY29yZV9zdGQgKwogICAgICAgICAgICAgICgxICsgYWJzX3Njb3JlX3N0ZCB8IHA3X2N0cnkpLCAjIHNpbmd1bGFyCiAgICAgICAgICAgICMgKDEgKyBhYnNfc2NvcmVfc3RkIHx8IHA3X2N0cnkpLCAjIGZhaWxlZCB0byBjb252ZXJnZQogICAgICAgICAgICBkYXRhID0gZDRfbG9uZykgIyBzaW5ndWxhcgoKcjFmIDwtIGxtZXIoc3Bpcml0X3Njb3JlX3N0ZCB+IDEgKyBhYnNfc2NvcmVfc3RkICsKICAgICAgICAgICAgICAoMSB8IHA3X2N0cnkvcDdfc3ViaiksCiAgICAgICAgICAgIGRhdGEgPSBkNF9sb25nKSAjIGZpbmUsIGJ1dCBkb2Vzbid0IGFjY291bnQgZm9yIHR3byBzY2FsZXMKCnIxZyA8LSBsbWVyKHNwaXJpdF9zY29yZV9zdGQgfiAxICsgYWJzX3Njb3JlX3N0ZCArCiAgICAgICAgICAgICAgKDAgKyBhYnNfc2NvcmVfc3RkIHwgc3Bpcml0X3NjYWxlKSwKICAgICAgICAgICAgZGF0YSA9IGQ0X2xvbmcpICMgb3ZlcnBhcmFtZXRlcml6ZWQ6IG9ubHkgMSBkZiBmb3IgdGVzdGluZyBtYWluIGVmZmVjdCBvZiBhYnNfc2NvcmUKCnIxaCA8LSBsbWVyKHNwaXJpdF9zY29yZV9zdGQgfiAxICsgYWJzX3Njb3JlX3N0ZCArCiAgICAgICAgICAgICAgKDEgKyBhYnNfc2NvcmVfc3RkIHwgcDdfY3RyeSkgKyAoMSB8IHA3X3N1YmopLAogICAgICAgICAgICBkYXRhID0gZDRfbG9uZykgIyBzaW5ndWxhcgpgYGAKCmBgYHtyfQpyMWlfZHNlIDwtIGxtZXIoZHNlX3Njb3JlX3N0ZCB+IGFic19zY29yZV9zdGQgKwogICAgICAgICAgICAgICAgICAoMSArIGFic19zY29yZV9zdGQgfCBwN19jdHJ5KSwgZDQpICMgc2luZ3VsYXIKCnIxaV9zcGV2IDwtIGxtZXIoc3Bldl9zY29yZV9zdGQgfiBhYnNfc2NvcmVfc3RkICsKICAgICAgICAgICAgICAgICAgICgxICsgYWJzX3Njb3JlX3N0ZCB8IHA3X2N0cnkpLCBkNCkgIyBzaW5ndWxhcgpgYGAKCgoKIyMgUHJpbWFyeSBhbmFseXNpcwoKIyMjIERhaWx5IFNwaXJpdHVhbCBFeHBlcmllbmNlcwoKYGBge3J9CnIxX2RzZSA8LSBsbWVyKGRzZV9zY29yZV9zdGQgfiBhYnNfc2NvcmVfc3RkICsgCiAgICAgICAgICAgICAgICAgKDEgKyBhYnNfc2NvcmVfc3RkIHx8IHA3X2N0cnkpLCBkNCkKc3VtbWFyeShyMV9kc2UpCmBgYAoKYGBge3J9CnJzcXVhcmVkKHIxX2RzZSkKYGBgCgpgYGB7cn0KcmVndGFiX2Z1bihyMV9kc2UpICU+JSByZWd0YWJfc3R5bGVfZnVuKHJvd19lbXBoID0gMikKYGBgCgpgYGB7cn0KIyByZWd0YWJfcmFuX2Z1bihyMV9kc2UpICU+JQojICAgbXV0YXRlKEdyb3VwID0gY2FzZV93aGVuKGlzLm5hKEdyb3VwKSB+ICJQYXJ0aWNpcGFudCwgbmVzdGVkIHdpdGhpbiBwN19jdHJ5IiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gYXMuY2hhcmFjdGVyKEdyb3VwKSksCiMgICAgICAgICAgR3JvdXAgPSBmYWN0b3IoR3JvdXAsIGxldmVscyA9IGMoInA3X2N0cnkiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFydGljaXBhbnQsIG5lc3RlZCB3aXRoaW4gcDdfY3RyeSIsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNpZHVhbCIpKSkgJT4lCiMgICBhcnJhbmdlKEdyb3VwKSAlPiUKIyAgIGthYmxlKGFsaWduID0gInIiKSAlPiUKIyAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTYpICU+JQojICAgcm93X3NwZWMoMTpucm93KHJlZ3RhYl9yYW5fZnVuKHIxX2RzZSkpLCBjb2xvciA9ICJibGFjayIpCmBgYAoKIyMjIFNwaXJpdHVhbCBFdmVudHMKCmBgYHtyfQpyMV9zcGV2IDwtIGxtZXIoc3Bldl9zY29yZV9zdGQgfiBhYnNfc2NvcmVfc3RkICsgCiAgICAgICAgICAgICAgICAgICgxICsgYWJzX3Njb3JlX3N0ZCB8fCBwN19jdHJ5KSwgZDQpCnN1bW1hcnkocjFfc3BldikKYGBgCgpgYGB7cn0KcnNxdWFyZWQocjFfc3BldikKYGBgCgpgYGB7cn0KcmVndGFiX2Z1bihyMV9zcGV2KSAlPiUgcmVndGFiX3N0eWxlX2Z1bihyb3dfZW1waCA9IDIpCmBgYAoKYGBge3J9CiMgcmVndGFiX3Jhbl9mdW4ocjFfc3BldikgJT4lCiMgICBtdXRhdGUoR3JvdXAgPSBjYXNlX3doZW4oaXMubmEoR3JvdXApIH4gIlBhcnRpY2lwYW50LCBuZXN0ZWQgd2l0aGluIHA3X2N0cnkiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBhcy5jaGFyYWN0ZXIoR3JvdXApKSwKIyAgICAgICAgICBHcm91cCA9IGZhY3RvcihHcm91cCwgbGV2ZWxzID0gYygicDdfY3RyeSIsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYXJ0aWNpcGFudCwgbmVzdGVkIHdpdGhpbiBwN19jdHJ5IiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlc2lkdWFsIikpKSAlPiUKIyAgIGFycmFuZ2UoR3JvdXApICU+JQojICAga2FibGUoYWxpZ24gPSAiciIpICU+JQojICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxNikgJT4lCiMgICByb3dfc3BlYygxOm5yb3cocmVndGFiX3Jhbl9mdW4ocjFfc3BldikpLCBjb2xvciA9ICJibGFjayIpCmBgYAoKIyMgcDdfY3RyeSBhcyBmaXhlZCBlZmZlY3QKCiMjIyBEYWlseSBTcGlyaXR1YWwgRXhwZXJpZW5jZXMKCmBgYHtyfQpyMl9kc2UgPC0gbG0oZHNlX3Njb3JlX3N0ZCB+IGFic19zY29yZV9zdGQgKiBwN19jdHJ5LCBkNCkKc3VtbWFyeShyMl9kc2UpCmBgYAoKYGBge3J9CnJzcXVhcmVkKHIyX2RzZSkKYGBgCgpgYGB7cn0KcmVndGFiX2Z1bihyMl9kc2UsIAogICAgICAgICAgIGNvdW50cnlfdmFyMSA9ICJwN19jdHJ5X2doIiwgCiAgICAgICAgICAgY291bnRyeV92YXIyID0gInA3X2N0cnlfdGgiLCAKICAgICAgICAgICBjb3VudHJ5X3ZhcjMgPSAicDdfY3RyeV9jaCIsIAogICAgICAgICAgIGNvdW50cnlfdmFyNCA9ICJwN19jdHJ5X3Z0IikgJT4lIAogIHJlZ3RhYl9zdHlsZV9mdW4ocm93X2VtcGggPSAyKQpgYGAKCgojIyMgU3Bpcml0dWFsIEV2ZW50cwoKYGBge3J9CnIyX3NwZXYgPC0gbG0oc3Bldl9zY29yZV9zdGQgfiBhYnNfc2NvcmVfc3RkICogcDdfY3RyeSwgZDQpCnN1bW1hcnkocjJfc3BldikKYGBgCgpgYGB7cn0KcnNxdWFyZWQocjJfc3BldikKYGBgCgpgYGB7cn0KcmVndGFiX2Z1bihyMl9zcGV2LAogICAgICAgICAgIGNvdW50cnlfdmFyMSA9ICJwN19jdHJ5X2doIiwgCiAgICAgICAgICAgY291bnRyeV92YXIyID0gInA3X2N0cnlfdGgiLCAKICAgICAgICAgICBjb3VudHJ5X3ZhcjMgPSAicDdfY3RyeV9jaCIsIAogICAgICAgICAgIGNvdW50cnlfdmFyNCA9ICJwN19jdHJ5X3Z0IikgJT4lCiAgcmVndGFiX3N0eWxlX2Z1bihyb3dfZW1waCA9IDIpCmBgYAoKCgojIFBvcm9zaXR5IGFuZCBhYnNvcnB0aW9uIGRpZmZlcmVudGlhbGx5IHByZWRpY3RpbmcgaW5kaXZpZHVhbCBleHRyYW9yZGluYXJ5IGV4cGVyaWVuY2VzCgpgYGB7cn0KZDRfZGlmZmVyZW50IDwtIGQ0ICU+JQogIHNlbGVjdChwN19jdHJ5LCBwN19zdWJqLCBwb3Jfc2NvcmVfc3RkLCBwdl9zY29yZV9zdGQsIGFic19zY29yZV9zdGQpICU+JQogIGZ1bGxfam9pbihkNF9ieXF1ZXN0aW9uICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoLXNjYWxlKSAlPiUKICAgICAgICAgICAgICAjIHN0YW5kYXJkaXplIHJlc3BvbnNlcyBieSBxdWVzdGlvbiAoY29sbGFwc2luZyBhY3Jvc3MgY291bnRyaWVzKQogICAgICAgICAgICAgIGdyb3VwX2J5KHF1ZXN0aW9uKSAlPiUKICAgICAgICAgICAgICBtdXRhdGUocmVzcG9uc2UgPSBzY2FsZShyZXNwb25zZSkpICU+JQogICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUKICAgICAgICAgICAgICBzcHJlYWQocXVlc3Rpb24sIHJlc3BvbnNlKSAlPiUKICAgICAgICAgICAgICBzZWxlY3QocDdfc3ViaiwgczRfdmFyX2RzZSwgczRfdmFyX3NwZXYsIHM0X3Zhcl9oYWxsLCBzNF92YXJfcGFyYSkpCmBgYAoKYGBge3J9CmQ0X2RpZmZlcmVudF9jb3IgPC0gZDRfZGlmZmVyZW50ICU+JQogIHNlbGVjdCgtcDdfY3RyeSwgLXA3X3N1YmopICU+JQogICMgdW5pdGUocDdfY3RyeS5wN19zdWJqLCBwN19jdHJ5LCBwN19zdWJqLCBzZXAgPSAiXyIpICU+JQogICMgY29sdW1uX3RvX3Jvd25hbWVzKCJwN19jdHJ5LnA3X3N1YmoiKSAlPiUKICBjb3IodXNlID0gInBhaXJ3aXNlLmNvbXBsZXRlIikgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigidmFyMSIpICU+JQogIGdhdGhlcih2YXIyLCBjb3IsIC12YXIxKQpgYGAKCmBgYHtyfQpkNF9kaWZmZXJlbnRfY29yMiA8LSBkNF9kaWZmZXJlbnRfY29yICU+JQogIGZpbHRlcihncmVwbCgic2NvcmUiLCB2YXIxKSwKICAgICAgICAgIWdyZXBsKCJzY29yZSIsIHZhcjIpKSAlPiUKICBtdXRhdGUodmFyMSA9IGZhY3RvcigKICAgIHZhcjEsIAogICAgbGV2ZWxzID0gYygicG9yX3Njb3JlX3N0ZCIsICJwdl9zY29yZV9zdGQiLCAiYWJzX3Njb3JlX3N0ZCIpLAogICAgbGFiZWxzID0gYygiUG9yb3NpdHkgU2NhbGUiLCAiUG9yb3NpdHkgVmlnbmV0dGVzIiwgIkFic29ycHRpb24iKSkpICU+JQogIGxlZnRfam9pbihkNF9ieXF1ZXN0aW9uICU+JSAKICAgICAgICAgICAgICBkaXN0aW5jdChzY2FsZSwgcXVlc3Rpb24pLCAKICAgICAgICAgICAgYnkgPSBjKCJ2YXIyIiA9ICJxdWVzdGlvbiIpKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIG11dGF0ZShzY2FsZSA9IGZhY3RvcigKICAgIHNjYWxlLAogICAgbGV2ZWxzID0gYygiZHNlX3Njb3JlIiwgInNwZXZfc2NvcmUiLCAiaGFsbF9zY29yZSIsICJwYXJhX3Njb3JlIiksCiAgICBsYWJlbHMgPSBjKCJEYWlseSBTcGlyaXR1YWwgRXhwZXJpZW5jZXNcbihVbmRlcndvb2QgJiBUZXJlc2ksIDIwMDIpIiwgCiAgICAgICAgICAgICAgICJTcGlyaXR1YWwgRXZlbnRzXG4obm92ZWwgbWVhc3VyZSkiLAogICAgICAgICAgICAgICAiSGFsbHVjaW5hdGlvbnNcbihNb3JyaXNvbiBldCBhbC4sIDIwMDApIiwgCiAgICAgICAgICAgICAgICJQYXJhbm9ybWFsXG4oVGhhbGJvcm5lICYgRGVsaW4sIDE5OTMpIikpLAogICAgdmFyMl9sYWIgPSBmYWN0b3IodmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoczRfdmFyX2RzZSwgczRfdmFyX3NwZXYsIHM0X3Zhcl9oYWxsLCBzNF92YXJfcGFyYSksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKHBhc3RlKCJJdGVtIiwgMTpsZW5ndGgoczRfdmFyX2RzZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZSgiSXRlbSIsIDE6bGVuZ3RoKHM0X3Zhcl9zcGV2KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlKCJJdGVtIiwgMTpsZW5ndGgoczRfdmFyX2hhbGwpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUoIkl0ZW0iLCAxOmxlbmd0aChzNF92YXJfcGFyYSkpKSkpICU+JQogIHJlbmFtZShwcmVkaWN0b3IgPSB2YXIxLCBleHBlcmllbmNlID0gdmFyMiwgZXhwZXJpZW5jZV9sYWIgPSB2YXIyX2xhYikKYGBgCgpgYGB7cn0KZDRfZGlmZmVyZW50X2Nvcl90b3A0IDwtIGQ0X2RpZmZlcmVudF9jb3IyICU+JQogIGdyb3VwX2J5KHByZWRpY3RvcikgJT4lCiAgdG9wX24oNCwgY29yKSAlPiUKICBhcnJhbmdlKHByZWRpY3RvciwgZGVzYyhjb3IpKQpkNF9kaWZmZXJlbnRfY29yX3RvcDQgJT4lIGthYmxlKGRpZ2l0cyA9IDIpICU+JSBrYWJsZV9zdHlsaW5nKCkgJT4lIGNvbGxhcHNlX3Jvd3MoMSkKCmQ0X2RpZmZlcmVudF9jb3JfdG9wNF9zcGV2IDwtIGQ0X2RpZmZlcmVudF9jb3IyICU+JQogIGZpbHRlcihncmVwbCgiU3Bpcml0dWFsIEV2ZW50cyIsIHNjYWxlKSkgJT4lCiAgZ3JvdXBfYnkocHJlZGljdG9yKSAlPiUKICB0b3Bfbig0LCBjb3IpICU+JQogIGFycmFuZ2UocHJlZGljdG9yLCBkZXNjKGNvcikpCiMgZDRfZGlmZmVyZW50X2Nvcl90b3A0X3NwZXYgJT4lIGthYmxlKGRpZ2l0cyA9IDIpICU+JSBrYWJsZV9zdHlsaW5nKCkgJT4lIGNvbGxhcHNlX3Jvd3MoMSkKCmQ0X2RpZmZlcmVudF9jb3JfdG9wNF9kc2UgPC0gZDRfZGlmZmVyZW50X2NvcjIgJT4lCiAgZmlsdGVyKGdyZXBsKCJEYWlseSBTcGlyaXR1YWwgRXhwZXJpZW5jZXMiLCBzY2FsZSkpICU+JQogIGdyb3VwX2J5KHByZWRpY3RvcikgJT4lCiAgdG9wX24oNCwgY29yKSAlPiUKICBhcnJhbmdlKHByZWRpY3RvciwgZGVzYyhjb3IpKQojIGQ0X2RpZmZlcmVudF9jb3JfdG9wNF9kc2UgJT4lIGthYmxlKGRpZ2l0cyA9IDIpICU+JSBrYWJsZV9zdHlsaW5nKCkgJT4lIGNvbGxhcHNlX3Jvd3MoMSkKCmQ0X2RpZmZlcmVudF9jb3JfdG9wNF9oYWxsIDwtIGQ0X2RpZmZlcmVudF9jb3IyICU+JQogIGZpbHRlcihncmVwbCgiSGFsbHVjaW5hdGlvbnMiLCBzY2FsZSkpICU+JQogIGdyb3VwX2J5KHByZWRpY3RvcikgJT4lCiAgdG9wX24oNCwgY29yKSAlPiUKICBhcnJhbmdlKHByZWRpY3RvciwgZGVzYyhjb3IpKQojIGQ0X2RpZmZlcmVudF9jb3JfdG9wNF9oYWxsICU+JSBrYWJsZShkaWdpdHMgPSAyKSAlPiUga2FibGVfc3R5bGluZygpICU+JSBjb2xsYXBzZV9yb3dzKDEpCgpkNF9kaWZmZXJlbnRfY29yX3RvcDRfcGFyYSA8LSBkNF9kaWZmZXJlbnRfY29yMiAlPiUKICBmaWx0ZXIoZ3JlcGwoIlBhcmFub3JtYWwiLCBzY2FsZSkpICU+JQogIGdyb3VwX2J5KHByZWRpY3RvcikgJT4lCiAgdG9wX24oNCwgY29yKSAlPiUKICBhcnJhbmdlKHByZWRpY3RvciwgZGVzYyhjb3IpKQojIGQ0X2RpZmZlcmVudF9jb3JfdG9wNF9wYXJhICU+JSBrYWJsZShkaWdpdHMgPSAyKSAlPiUga2FibGVfc3R5bGluZygpICU+JSBjb2xsYXBzZV9yb3dzKDEpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDIuNSwgZmlnLmFzcCA9IDIuNX0KZDRfZGlmZmVyZW50X2NvcjIgJT4lCiAgbGVmdF9qb2luKGQ0X2RpZmZlcmVudF9jb3JfdG9wNCAlPiUgbXV0YXRlKHRvcDQgPSAiYm9sZCIpKSAlPiUKICBtdXRhdGUodG9wNCA9IGNhc2Vfd2hlbihpcy5uYSh0b3A0KSB+ICJwbGFpbiIsIFRSVUUgfiB0b3A0KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHJlZGljdG9yLCB5ID0gcmVvcmRlcihleHBlcmllbmNlX2xhYiwgZGVzYyhleHBlcmllbmNlX2xhYikpLCAKICAgICAgICAgICAgIGZpbGwgPSBjb3IsIGxhYmVsID0gZm9ybWF0KHJvdW5kKGNvciwgMiksIG5zbWFsbCA9IDIpKSkgKwogIGZhY2V0X2dyaWQoc2NhbGUgfiAuLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGFlcyhzaXplID0gdG9wNCksIAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNob3cubGVnZW5kID0gVCkgKwogIGdlb21fdGV4dChhZXMoZm9udGZhY2UgPSB0b3A0KSwgCiAgICAgICAgICAgIHNpemUgPSAzKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcndpZHRoID0gMTAsIGJhcmhlaWdodCA9IDAuNSkpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKDAuNSwgMC4wNSkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgbGFicyh4ID0gIlByZWRpY3RvciIsIHkgPSAiRXhwZXJpZW5jZSBJdGVtIiwgZmlsbCA9ICJQZWFyc29uJ3MgciIpICsKICBndWlkZXMoc2l6ZSA9ICJub25lIikKYGBgCgpgYGB7cn0KZDRfZGlmZmVyZW50X2NvcjIgJT4lIAogIHNlbGVjdChzY2FsZSwgZXhwZXJpZW5jZV9sYWIsIHByZWRpY3RvciwgY29yKSAlPiUKICBzcHJlYWQocHJlZGljdG9yLCBjb3IpICU+JQogIHJlbmFtZShTY2FsZSA9IHNjYWxlLCBJdGVtID0gZXhwZXJpZW5jZV9sYWIpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKSAjICU+JQogICMgY29sbGFwc2Vfcm93cygxKQpgYGAKCgojIyBCeSBjb3VudHJ5LCB2ZXJzaW9uIDEgKHN0YW5kYXJkaXplZCB3aXRoaW4gY291bnRyeSwgY29ycmVsYXRlIGFjcm9zcykKCmBgYHtyfQpkNF9kaWZmZXJlbnRfYnljb3VudHJ5IDwtIGQ0ICU+JQogIHNlbGVjdChwN19jdHJ5LCBwN19zdWJqLCBwb3Jfc2NvcmVfc3RkMiwgcHZfc2NvcmVfc3RkMiwgYWJzX3Njb3JlX3N0ZDIpICU+JQogIGZ1bGxfam9pbihkNF9ieXF1ZXN0aW9uICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoLXNjYWxlKSAlPiUKICAgICAgICAgICAgICBncm91cF9ieShwN19jdHJ5LCBxdWVzdGlvbikgJT4lCiAgICAgICAgICAgICAgIyBzdGFuZGFyZGl6ZSByZXNwb25zZXMgYnkgY291bnRyeSBhbmQgcXVlc3Rpb24KICAgICAgICAgICAgICBtdXRhdGUocmVzcG9uc2UgPSBzY2FsZShyZXNwb25zZSkpICU+JQogICAgICAgICAgICAgIHNwcmVhZChxdWVzdGlvbiwgcmVzcG9uc2UpICU+JQogICAgICAgICAgICAgIHNlbGVjdChwN19zdWJqLCBzNF92YXJfZHNlLCBzNF92YXJfc3BldiwgczRfdmFyX2hhbGwsIHM0X3Zhcl9wYXJhKSkKYGBgCgpgYGB7cn0KZDRfZGlmZmVyZW50X2J5Y291bnRyeV9jb3IgPC0gZDRfZGlmZmVyZW50X2J5Y291bnRyeSAlPiUKICBzZWxlY3QoLXA3X2N0cnksIC1wN19zdWJqKSAlPiUKICAjIHVuaXRlKHA3X2N0cnkucDdfc3ViaiwgcDdfY3RyeSwgcDdfc3Viaiwgc2VwID0gIl8iKSAlPiUKICAjIGNvbHVtbl90b19yb3duYW1lcygicDdfY3RyeS5wN19zdWJqIikgJT4lCiAgY29yKHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZSIpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInZhcjEiKSAlPiUKICBnYXRoZXIodmFyMiwgY29yLCAtdmFyMSkKYGBgCgpgYGB7cn0KZDRfZGlmZmVyZW50X2J5Y291bnRyeV9jb3IyIDwtIGQ0X2RpZmZlcmVudF9ieWNvdW50cnlfY29yICU+JQogIGZpbHRlcihncmVwbCgic2NvcmUiLCB2YXIxKSwKICAgICAgICAgIWdyZXBsKCJzY29yZSIsIHZhcjIpKSAlPiUKICBtdXRhdGUodmFyMSA9IGZhY3RvcigKICAgIHZhcjEsIAogICAgbGV2ZWxzID0gYygicG9yX3Njb3JlX3N0ZDIiLCAicHZfc2NvcmVfc3RkMiIsICJhYnNfc2NvcmVfc3RkMiIpLAogICAgbGFiZWxzID0gYygiUG9yb3NpdHkgU2NhbGUiLCAiUG9yb3NpdHkgVmlnbmV0dGVzIiwgIkFic29ycHRpb24iKSkpICU+JQogIGxlZnRfam9pbihkNF9ieXF1ZXN0aW9uICU+JSAKICAgICAgICAgICAgICBkaXN0aW5jdChzY2FsZSwgcXVlc3Rpb24pLCAKICAgICAgICAgICAgYnkgPSBjKCJ2YXIyIiA9ICJxdWVzdGlvbiIpKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIG11dGF0ZShzY2FsZSA9IGZhY3RvcigKICAgIHNjYWxlLAogICAgbGV2ZWxzID0gYygiZHNlX3Njb3JlIiwgInNwZXZfc2NvcmUiLCAiaGFsbF9zY29yZSIsICJwYXJhX3Njb3JlIiksCiAgICBsYWJlbHMgPSBjKCJEYWlseSBTcGlyaXR1YWwgRXhwZXJpZW5jZXNcbihVbmRlcndvb2QgJiBUZXJlc2ksIDIwMDIpIiwgCiAgICAgICAgICAgICAgICJTcGlyaXR1YWwgRXZlbnRzXG4obm92ZWwgbWVhc3VyZSkiLAogICAgICAgICAgICAgICAiSGFsbHVjaW5hdGlvbnNcbihNb3JyaXNvbiBldCBhbC4sIDIwMDApIiwgCiAgICAgICAgICAgICAgICJQYXJhbm9ybWFsXG4oVGhhbGJvcm5lICYgRGVsaW4sIDE5OTMpIikpLAogICAgdmFyMl9sYWIgPSBmYWN0b3IodmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoczRfdmFyX2RzZSwgczRfdmFyX3NwZXYsIHM0X3Zhcl9oYWxsLCBzNF92YXJfcGFyYSksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKHBhc3RlKCJJdGVtIiwgMTpsZW5ndGgoczRfdmFyX2RzZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZSgiSXRlbSIsIDE6bGVuZ3RoKHM0X3Zhcl9zcGV2KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlKCJJdGVtIiwgMTpsZW5ndGgoczRfdmFyX2hhbGwpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUoIkl0ZW0iLCAxOmxlbmd0aChzNF92YXJfcGFyYSkpKSkpICU+JQogIHJlbmFtZShwcmVkaWN0b3IgPSB2YXIxLCBleHBlcmllbmNlID0gdmFyMiwgZXhwZXJpZW5jZV9sYWIgPSB2YXIyX2xhYikKYGBgCgpgYGB7cn0KZDRfZGlmZmVyZW50X2J5Y291bnRyeV9jb3JfdG9wNCA8LSBkNF9kaWZmZXJlbnRfYnljb3VudHJ5X2NvcjIgJT4lCiAgZ3JvdXBfYnkocHJlZGljdG9yKSAlPiUKICB0b3Bfbig0LCBjb3IpICU+JQogIGFycmFuZ2UocHJlZGljdG9yLCBkZXNjKGNvcikpCgpkNF9kaWZmZXJlbnRfYnljb3VudHJ5X2Nvcl90b3A0X3NwZXYgPC0gZDRfZGlmZmVyZW50X2J5Y291bnRyeV9jb3IyICU+JQogIGZpbHRlcihncmVwbCgiU3Bpcml0dWFsIEV2ZW50cyIsIHNjYWxlKSkgJT4lCiAgZ3JvdXBfYnkocHJlZGljdG9yKSAlPiUKICB0b3Bfbig0LCBjb3IpICU+JQogIGFycmFuZ2UocHJlZGljdG9yLCBkZXNjKGNvcikpCgpkNF9kaWZmZXJlbnRfYnljb3VudHJ5X2Nvcl90b3A0X2RzZSA8LSBkNF9kaWZmZXJlbnRfYnljb3VudHJ5X2NvcjIgJT4lCiAgZmlsdGVyKGdyZXBsKCJEYWlseSBTcGlyaXR1YWwgRXhwZXJpZW5jZXMiLCBzY2FsZSkpICU+JQogIGdyb3VwX2J5KHByZWRpY3RvcikgJT4lCiAgdG9wX24oNCwgY29yKSAlPiUKICBhcnJhbmdlKHByZWRpY3RvciwgZGVzYyhjb3IpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAyLjUsIGZpZy5hc3AgPSAyLjV9CmQ0X2RpZmZlcmVudF9ieWNvdW50cnlfY29yMiAlPiUKICBsZWZ0X2pvaW4oZDRfZGlmZmVyZW50X2J5Y291bnRyeV9jb3JfdG9wNCAlPiUgbXV0YXRlKHRvcDQgPSAiYm9sZCIpKSAlPiUKICBtdXRhdGUodG9wNCA9IGNhc2Vfd2hlbihpcy5uYSh0b3A0KSB+ICJwbGFpbiIsIFRSVUUgfiB0b3A0KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHJlZGljdG9yLCB5ID0gcmVvcmRlcihleHBlcmllbmNlX2xhYiwgZGVzYyhleHBlcmllbmNlX2xhYikpLCAKICAgICAgICAgICAgIGZpbGwgPSBjb3IsIGxhYmVsID0gZm9ybWF0KHJvdW5kKGNvciwgMiksIG5zbWFsbCA9IDIpKSkgKwogIGZhY2V0X2dyaWQoc2NhbGUgfiAuLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGFlcyhzaXplID0gdG9wNCksIAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNob3cubGVnZW5kID0gVCkgKwogIGdlb21fdGV4dChhZXMoZm9udGZhY2UgPSB0b3A0KSwgCiAgICAgICAgICAgIHNpemUgPSAzKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcndpZHRoID0gMTAsIGJhcmhlaWdodCA9IDAuNSkpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKDAuNSwgMC4wNSkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgbGFicyh4ID0gIlByZWRpY3RvciIsIHkgPSAiRXhwZXJpZW5jZSBJdGVtIiwgZmlsbCA9ICJQZWFyc29uJ3MgciIpICsKICBndWlkZXMoc2l6ZSA9ICJub25lIikKYGBgCgojIyBCeSBjb3VudHJ5LCB2ZXJzaW9uIDIgKHN0YW5kYXJkaXplZCB3aXRoaW4gY291bnRyeSwgY29ycmVsYXRlIHdpdGhpbikKCmBgYHtyfQpkNF9kaWZmZXJlbnRfYnljb3VudHJ5MiA8LSBkNCAlPiUKICBzZWxlY3QocDdfY3RyeSwgcDdfc3ViaiwgcG9yX3Njb3JlX3N0ZDIsIHB2X3Njb3JlX3N0ZDIsIGFic19zY29yZV9zdGQyKSAlPiUKICBmdWxsX2pvaW4oZDRfYnlxdWVzdGlvbiAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KC1zY2FsZSkgJT4lCiAgICAgICAgICAgICAgZ3JvdXBfYnkocDdfY3RyeSwgcXVlc3Rpb24pICU+JQogICAgICAgICAgICAgICMgc3RhbmRhcmRpemUgcmVzcG9uc2VzIGJ5IGNvdW50cnkgYW5kIHF1ZXN0aW9uCiAgICAgICAgICAgICAgbXV0YXRlKHJlc3BvbnNlID0gc2NhbGUocmVzcG9uc2UpKSAlPiUKICAgICAgICAgICAgICB1bmdyb3VwKCkgJT4lCiAgICAgICAgICAgICAgc3ByZWFkKHF1ZXN0aW9uLCByZXNwb25zZSkgJT4lCiAgICAgICAgICAgICAgc2VsZWN0KHA3X3N1YmosIHM0X3Zhcl9kc2UsIHM0X3Zhcl9zcGV2LCBzNF92YXJfaGFsbCwgczRfdmFyX3BhcmEpKQpgYGAKCmBgYHtyfQpkNF9kaWZmZXJlbnRfYnljb3VudHJ5Ml9jb3JfdXMgPC0gZDRfZGlmZmVyZW50X2J5Y291bnRyeTIgJT4lCiAgZmlsdGVyKHA3X2N0cnkgPT0gIlVTIikgJT4lCiAgc2VsZWN0KC1wN19jdHJ5LCAtcDdfc3ViaikgJT4lCiAgIyB1bml0ZShwN19jdHJ5LnA3X3N1YmosIHA3X2N0cnksIHA3X3N1YmosIHNlcCA9ICJfIikgJT4lCiAgIyBjb2x1bW5fdG9fcm93bmFtZXMoInA3X2N0cnkucDdfc3ViaiIpICU+JQogIGNvcih1c2UgPSAicGFpcndpc2UuY29tcGxldGUiKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJ2YXIxIikgJT4lCiAgZ2F0aGVyKHZhcjIsIGNvciwgLXZhcjEpCgpkNF9kaWZmZXJlbnRfYnljb3VudHJ5Ml9jb3JfZ2ggPC0gZDRfZGlmZmVyZW50X2J5Y291bnRyeTIgJT4lCiAgZmlsdGVyKHA3X2N0cnkgPT0gIkdoYW5hIikgJT4lCiAgc2VsZWN0KC1wN19jdHJ5LCAtcDdfc3ViaikgJT4lCiAgIyB1bml0ZShwN19jdHJ5LnA3X3N1YmosIHA3X2N0cnksIHA3X3N1YmosIHNlcCA9ICJfIikgJT4lCiAgIyBjb2x1bW5fdG9fcm93bmFtZXMoInA3X2N0cnkucDdfc3ViaiIpICU+JQogIGNvcih1c2UgPSAicGFpcndpc2UuY29tcGxldGUiKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJ2YXIxIikgJT4lCiAgZ2F0aGVyKHZhcjIsIGNvciwgLXZhcjEpCgpkNF9kaWZmZXJlbnRfYnljb3VudHJ5Ml9jb3JfdGggPC0gZDRfZGlmZmVyZW50X2J5Y291bnRyeTIgJT4lCiAgZmlsdGVyKHA3X2N0cnkgPT0gIlRoYWlsYW5kIikgJT4lCiAgc2VsZWN0KC1wN19jdHJ5LCAtcDdfc3ViaikgJT4lCiAgIyB1bml0ZShwN19jdHJ5LnA3X3N1YmosIHA3X2N0cnksIHA3X3N1YmosIHNlcCA9ICJfIikgJT4lCiAgIyBjb2x1bW5fdG9fcm93bmFtZXMoInA3X2N0cnkucDdfc3ViaiIpICU+JQogIGNvcih1c2UgPSAicGFpcndpc2UuY29tcGxldGUiKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJ2YXIxIikgJT4lCiAgZ2F0aGVyKHZhcjIsIGNvciwgLXZhcjEpCgpkNF9kaWZmZXJlbnRfYnljb3VudHJ5Ml9jb3JfY2ggPC0gZDRfZGlmZmVyZW50X2J5Y291bnRyeTIgJT4lCiAgZmlsdGVyKHA3X2N0cnkgPT0gIkNoaW5hIikgJT4lCiAgc2VsZWN0KC1wN19jdHJ5LCAtcDdfc3ViaikgJT4lCiAgIyB1bml0ZShwN19jdHJ5LnA3X3N1YmosIHA3X2N0cnksIHA3X3N1YmosIHNlcCA9ICJfIikgJT4lCiAgIyBjb2x1bW5fdG9fcm93bmFtZXMoInA3X2N0cnkucDdfc3ViaiIpICU+JQogIGNvcih1c2UgPSAicGFpcndpc2UuY29tcGxldGUiKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJ2YXIxIikgJT4lCiAgZ2F0aGVyKHZhcjIsIGNvciwgLXZhcjEpCgpkNF9kaWZmZXJlbnRfYnljb3VudHJ5Ml9jb3JfdnQgPC0gZDRfZGlmZmVyZW50X2J5Y291bnRyeTIgJT4lCiAgZmlsdGVyKHA3X2N0cnkgPT0gIlZhbnVhdHUiKSAlPiUKICBzZWxlY3QoLXA3X2N0cnksIC1wN19zdWJqKSAlPiUKICAjIHVuaXRlKHA3X2N0cnkucDdfc3ViaiwgcDdfY3RyeSwgcDdfc3Viaiwgc2VwID0gIl8iKSAlPiUKICAjIGNvbHVtbl90b19yb3duYW1lcygicDdfY3RyeS5wN19zdWJqIikgJT4lCiAgY29yKHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZSIpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInZhcjEiKSAlPiUKICBnYXRoZXIodmFyMiwgY29yLCAtdmFyMSkKYGBgCgpgYGB7cn0KZDRfZGlmZmVyZW50X2J5Y291bnRyeTJfY29yIDwtIGJpbmRfcm93cygKICBkNF9kaWZmZXJlbnRfYnljb3VudHJ5Ml9jb3JfdXMgJT4lIG11dGF0ZShjb3VudHJ5ID0gIlVTIiksCiAgZDRfZGlmZmVyZW50X2J5Y291bnRyeTJfY29yX2doICU+JSBtdXRhdGUoY291bnRyeSA9ICJHaGFuYSIpLAogIGQ0X2RpZmZlcmVudF9ieWNvdW50cnkyX2Nvcl90aCAlPiUgbXV0YXRlKGNvdW50cnkgPSAiVGhhaWxhbmQiKSwKICBkNF9kaWZmZXJlbnRfYnljb3VudHJ5Ml9jb3JfY2ggJT4lIG11dGF0ZShjb3VudHJ5ID0gIkNoaW5hIiksCiAgZDRfZGlmZmVyZW50X2J5Y291bnRyeTJfY29yX3Z0ICU+JSBtdXRhdGUoY291bnRyeSA9ICJWYW51YXR1IikpCmBgYAoKYGBge3J9CmQ0X2RpZmZlcmVudF9ieWNvdW50cnkyX2NvcjIgPC0gZDRfZGlmZmVyZW50X2J5Y291bnRyeTJfY29yICU+JQogIGZpbHRlcihncmVwbCgic2NvcmUiLCB2YXIxKSwKICAgICAgICAgIWdyZXBsKCJzY29yZSIsIHZhcjIpKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHMgPSBsZXZlbHNfY291bnRyeSkpICU+JQogIG11dGF0ZSh2YXIxID0gZmFjdG9yKAogICAgdmFyMSwgCiAgICBsZXZlbHMgPSBjKCJwb3Jfc2NvcmVfc3RkMiIsICJwdl9zY29yZV9zdGQyIiwgImFic19zY29yZV9zdGQyIiksCiAgICBsYWJlbHMgPSBjKCJQb3Jvc2l0eSBTY2FsZSIsICJQb3Jvc2l0eSBWaWduZXR0ZXMiLCAiQWJzb3JwdGlvbiIpKSkgJT4lCiAgbGVmdF9qb2luKGQ0X2J5cXVlc3Rpb24gJT4lIAogICAgICAgICAgICAgIGRpc3RpbmN0KHNjYWxlLCBxdWVzdGlvbiksIAogICAgICAgICAgICBieSA9IGMoInZhcjIiID0gInF1ZXN0aW9uIikpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgbXV0YXRlKHNjYWxlID0gZmFjdG9yKAogICAgc2NhbGUsCiAgICBsZXZlbHMgPSBjKCJkc2Vfc2NvcmUiLCAic3Bldl9zY29yZSIsICJoYWxsX3Njb3JlIiwgInBhcmFfc2NvcmUiKSwKICAgIGxhYmVscyA9IGMoIkRhaWx5IFNwaXJpdHVhbCBFeHBlcmllbmNlc1xuKFVuZGVyd29vZCAmIFRlcmVzaSwgMjAwMikiLCAKICAgICAgICAgICAgICAgIlNwaXJpdHVhbCBFdmVudHNcbihub3ZlbCBtZWFzdXJlKSIsCiAgICAgICAgICAgICAgICJIYWxsdWNpbmF0aW9uc1xuKE1vcnJpc29uIGV0IGFsLiwgMjAwMCkiLCAKICAgICAgICAgICAgICAgIlBhcmFub3JtYWxcbihUaGFsYm9ybmUgJiBEZWxpbiwgMTk5MykiKSksCiAgICB2YXIyX2xhYiA9IGZhY3Rvcih2YXIyLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYyhzNF92YXJfZHNlLCBzNF92YXJfc3BldiwgczRfdmFyX2hhbGwsIHM0X3Zhcl9wYXJhKSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMocGFzdGUoIkl0ZW0iLCAxOmxlbmd0aChzNF92YXJfZHNlKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlKCJJdGVtIiwgMTpsZW5ndGgoczRfdmFyX3NwZXYpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUoIkl0ZW0iLCAxOmxlbmd0aChzNF92YXJfaGFsbCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZSgiSXRlbSIsIDE6bGVuZ3RoKHM0X3Zhcl9wYXJhKSkpKSkgJT4lCiAgcmVuYW1lKHByZWRpY3RvciA9IHZhcjEsIGV4cGVyaWVuY2UgPSB2YXIyLCBleHBlcmllbmNlX2xhYiA9IHZhcjJfbGFiKQpgYGAKCmBgYHtyfQpkNF9kaWZmZXJlbnRfYnljb3VudHJ5Ml9jb3JfdG9wNCA8LSBkNF9kaWZmZXJlbnRfYnljb3VudHJ5Ml9jb3IyICU+JQogIGdyb3VwX2J5KHByZWRpY3RvciwgY291bnRyeSkgJT4lCiAgdG9wX24oNCwgY29yKSAlPiUKICBhcnJhbmdlKHByZWRpY3RvciwgZGVzYyhjb3IpKQoKZDRfZGlmZmVyZW50X2J5Y291bnRyeTJfY29yX3RvcDRfc3BldiA8LSBkNF9kaWZmZXJlbnRfYnljb3VudHJ5Ml9jb3IyICU+JQogIGZpbHRlcihncmVwbCgiU3Bpcml0dWFsIEV2ZW50cyIsIHNjYWxlKSkgJT4lCiAgZ3JvdXBfYnkocHJlZGljdG9yLCBjb3VudHJ5KSAlPiUKICB0b3Bfbig0LCBjb3IpICU+JQogIGFycmFuZ2UocHJlZGljdG9yLCBkZXNjKGNvcikpCgpkNF9kaWZmZXJlbnRfYnljb3VudHJ5Ml9jb3JfdG9wNF9kc2UgPC0gZDRfZGlmZmVyZW50X2J5Y291bnRyeTJfY29yMiAlPiUKICBmaWx0ZXIoZ3JlcGwoIkRhaWx5IFNwaXJpdHVhbCBFeHBlcmllbmNlcyIsIHNjYWxlKSkgJT4lCiAgZ3JvdXBfYnkocHJlZGljdG9yLCBjb3VudHJ5KSAlPiUKICB0b3Bfbig0LCBjb3IpICU+JQogIGFycmFuZ2UocHJlZGljdG9yLCBkZXNjKGNvcikpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxLjI1fQpkNF9kaWZmZXJlbnRfYnljb3VudHJ5Ml9jb3IyICU+JQogIGxlZnRfam9pbihkNF9kaWZmZXJlbnRfYnljb3VudHJ5Ml9jb3JfdG9wNCAlPiUgbXV0YXRlKHRvcDQgPSAiYm9sZCIpKSAlPiUKICBtdXRhdGUodG9wNCA9IGNhc2Vfd2hlbihpcy5uYSh0b3A0KSB+ICJwbGFpbiIsIFRSVUUgfiB0b3A0KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY291bnRyeSwgeSA9IHJlb3JkZXIoZXhwZXJpZW5jZV9sYWIsIGRlc2MoZXhwZXJpZW5jZV9sYWIpKSwgCiAgICAgICAgICAgICBmaWxsID0gY29yLCBsYWJlbCA9IGZvcm1hdChyb3VuZChjb3IsIDIpLCBuc21hbGwgPSAyKSkpICsKICBmYWNldF9ncmlkKHNjYWxlIH4gcHJlZGljdG9yLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGFlcyhzaXplID0gdG9wNCksIAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNob3cubGVnZW5kID0gVCkgKwogIGdlb21fdGV4dChhZXMoZm9udGZhY2UgPSB0b3A0KSwgCiAgICAgICAgICAgIHNpemUgPSAzKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcndpZHRoID0gMTAsIGJhcmhlaWdodCA9IDAuNSkpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKDAuNSwgMC4wNSkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnMoeCA9ICJDb3VudHJ5IiwgeSA9ICJFeHBlcmllbmNlIEl0ZW0iLCBmaWxsID0gIlBlYXJzb24ncyByIikgKwogIGd1aWRlcyhzaXplID0gIm5vbmUiKQpgYGAKCgoKYGBge3J9CmQ0ICU+JQogIHNlbGVjdChwN19jdHJ5LCBwN19zdWJqLCBlbmRzX3dpdGgoIl9zdGQiKSkgJT4lCiAgZ2F0aGVyKHNjYWxlLCBzY29yZSwgZW5kc193aXRoKCJzdGQiKSkgJT4lCiAgZmlsdGVyKHNjYWxlID09ICJkc2Vfc2NvcmVfc3RkIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcDdfY3RyeSwgeSA9IHNjb3JlLCBjb2xvciA9IHA3X2N0cnkpKSArCiAgZ2VvbV9qaXR0ZXIoaGVpZ2h0ID0gMCwgYWxwaGEgPSAwLjIpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IC4gJT4lIAogICAgICAgICAgICAgICAgICAgIGRpc3RpbmN0KHA3X2N0cnksIHA3X3N1YmosIHNjb3JlKSAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShwN19jdHJ5KSAlPiUgCiAgICAgICAgICAgICAgICAgICAgbXVsdGlfYm9vdF9zdGFuZGFyZChjb2wgPSAic2NvcmUiLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX2xvd2VyKSwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKQoKZDQgJT4lCiAgc2VsZWN0KHA3X2N0cnksIHA3X3N1YmosIGVuZHNfd2l0aCgiX3N0ZCIpKSAlPiUKICBnYXRoZXIoc2NhbGUsIHNjb3JlLCBlbmRzX3dpdGgoInN0ZCIpKSAlPiUKICBmaWx0ZXIoc2NhbGUgPT0gImRzZV9zY29yZV9zdGQiKSAlPiUgCiAgZGlzdGluY3QocDdfY3RyeSwgcDdfc3Viaiwgc2NvcmUpICU+JSAKICBncm91cF9ieShwN19jdHJ5KSAlPiUgCiAgbXVsdGlfYm9vdF9zdGFuZGFyZChjb2wgPSAic2NvcmUiLCBuYS5ybSA9IFQpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwN19jdHJ5LCB5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpKSArCiAgZ2VvbV9wb2ludHJhbmdlKCkgKwogIHlsaW0oLTIsIDIpCgpkNCAlPiUKICBzZWxlY3QocDdfY3RyeSwgcDdfc3ViaiwgZW5kc193aXRoKCJfc3RkIikpICU+JQogIGdhdGhlcihzY2FsZSwgc2NvcmUsIGVuZHNfd2l0aCgic3RkIikpICU+JQogIGZpbHRlcihzY2FsZSA9PSAiZHNlX3Njb3JlX3N0ZCIpICU+JSAKICBkaXN0aW5jdChwN19jdHJ5LCBwN19zdWJqLCBzY29yZSkgJT4lIAogIGdyb3VwX2J5KHA3X2N0cnkpICU+JSAKICBzdW1tYXJpc2UobWVhbiA9IG1lYW4oc2NvcmUsIG5hLnJtID0gVCksCiAgICAgICAgICAgIHNkID0gc2Qoc2NvcmUsIG5hLnJtID0gVCksCiAgICAgICAgICAgIGxvd2VyID0gbWVhbiAtIHNkLAogICAgICAgICAgICB1cHBlciA9IG1lYW4gKyBzZCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcDdfY3RyeSwgeSA9IG1lYW4sIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSkgKwogIGdlb21fcG9pbnRyYW5nZSgpICsKICB5bGltKC0yLCAyKQpgYGAKCg==